﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class ProfineEssentialElementsCollection : AbstractCollection
    {
        /// <summary>
        /// Список реквизитов
        /// </summary>
        public List<ProfineEssentialElements> ProfineEssentialElementsList
        {
            get { return Entities.ProfineEssentialElements.ToList(); }
        }

        /// <summary>
        /// Текущие реквизиты
        /// </summary>
        public ProfineEssentialElements CurrentEssentialElements
        {
            get
            {
                return
                    Entities.ProfineEssentialElements.OrderBy(c => c.ValidTill).FirstOrDefault(
                        c => c.ValidTill > DateTime.Now);
            }
        }

        #region Overrides of AbstractCollection

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(ProfineEssentialElementsList);
        }

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (ProfineEssentialElements);
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return null;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.ProfineEssentialElements.Find(itemId);
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            throw new NotImplementedException();
        }

        #endregion

        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public new bool Update(object item, string userLogin)
        {
            var newObject = (ProfineEssentialElements) item;
            if (newObject == null)
                return false;


            var object4Update = GetItemByIdFromDatabase(newObject.GetKeyValue()) as ProfineEssentialElements;
            if (object4Update == null)
                return false;

            if (!string.IsNullOrEmpty(newObject.BIK))
                object4Update.BIK = newObject.BIK;

            if (!string.IsNullOrEmpty(newObject.Bank))
                object4Update.Bank = newObject.Bank;

            if (!string.IsNullOrEmpty(newObject.GenDirFull))
                object4Update.GenDirFull = newObject.GenDirFull;

            if (!string.IsNullOrEmpty(newObject.GenDirFullInRP))
                object4Update.GenDirFullInRP = newObject.GenDirFullInRP;

            if (!string.IsNullOrEmpty(newObject.GenDirShort))
                object4Update.GenDirShort = newObject.GenDirShort;

            if (!string.IsNullOrEmpty(newObject.GenDirShortInRP))
                object4Update.GenDirShortInRP = newObject.GenDirShortInRP;

            if (!string.IsNullOrEmpty(newObject.FactAddress))
                object4Update.FactAddress = newObject.FactAddress;

            if (!string.IsNullOrEmpty(newObject.LegalAddress))
                object4Update.LegalAddress = newObject.LegalAddress;


            if (!string.IsNullOrEmpty(newObject.INN))
                object4Update.INN = newObject.INN;


            object4Update.Name = newObject.Name;

            object4Update.IdOwnershipPattern = newObject.IdOwnershipPattern;


            if (!string.IsNullOrEmpty(newObject.KPP))
                object4Update.KPP = newObject.KPP;

            if (!string.IsNullOrEmpty(newObject.KS))
                object4Update.KS = newObject.KS;

            if (!string.IsNullOrEmpty(newObject.OKPO))
                object4Update.OKPO = newObject.OKPO;

            if (!string.IsNullOrEmpty(newObject.OKONX))
                object4Update.OKONX = newObject.OKONX;


            if (!string.IsNullOrEmpty(newObject.RSEUR))
                object4Update.RSEUR = newObject.RSEUR;

            if (!string.IsNullOrEmpty(newObject.RSRUR))
                object4Update.RSRUR = newObject.RSRUR;

            object4Update.ValidTill = newObject.ValidTill;


            return base.Update(item, userLogin);
        }

        public ProfineEssentialElements GetProfineEssentialElementByDate(DateTime date)
        {
            return Entities.ProfineEssentialElements.OrderBy(c => c.ValidTill).FirstOrDefault(c => c.ValidTill > date);
        }
    }
}